package com.bls.cate.ui.widget;

import android.content.Context;
import android.support.v4.widget.NestedScrollView;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
 * 　　  () 　　　  ()
 * 　　  ( ) 　　　( )
 * 　　  ( ) 　　　( )
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　┻　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ——————————————————
 * Created by BinglingSu on 2018/4/3.
 */

public class BlsScrollView extends NestedScrollView {

    public BlsScrollView(Context context) {
        super(context);
    }

    public BlsScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public BlsScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private BlsScrollListener blsScrollListener;
    private BlsTouchListener blsTouchListener;

    public void setOnBlsScrollChangeListener(BlsScrollListener blsScrollListener) {
        this.blsScrollListener = blsScrollListener;
    }

    public void setOnBlsTouchListener(BlsTouchListener blsTouchListener) {
        this.blsTouchListener = blsTouchListener;
    }

    /**
     * Runnable延迟执行的时间
     */
    private long delayMillis = 100;

    /**
     * 上次滑动的时间
     */
    private long lastScrollUpdate = -1;


    /**
     * 监听滑动结束，执行任务
     */
    private Runnable scrollerTask = new Runnable() {
        @Override
        public void run() {
            long currentTime = System.currentTimeMillis();
            if ((currentTime - lastScrollUpdate) > 100) {
                lastScrollUpdate = -1;
                onScrollEnd();
            } else {
                postDelayed(this, delayMillis);
            }
        }
    };

    /**
     * 定义一个滚动接口
     */
    public interface BlsScrollListener {
        void onBlsScrollStateListener(BlsScrollView blsScrollView, BlsScrollViewState state, int l, int t, int oldL, int oldT);
    }

    /**
     * 定义一个触屏接口
     */
    public interface BlsTouchListener {
        void onBlsTouchListener(BlsScrollView blsScrollView, MotionEvent motionEvent);
    }

    /**
     * 当scrollView滑动时系统会调用该方法,并将该回调放过中的参数传递到自定义接口的回调方法中,达到scrollView滑动监听的效果
     */
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (blsScrollListener != null) {
            blsScrollListener.onBlsScrollStateListener(this, BlsScrollViewState.SCROLL, l, t, oldl, oldt);
        }
        if (lastScrollUpdate == -1) {
            onScrollStart();
            postDelayed(scrollerTask, delayMillis);
        }
        lastScrollUpdate = System.currentTimeMillis(); // 更新ScrollView的滑动时间
    }

    /**
     * 滑动开始
     */
    private void onScrollStart() {
        if (blsScrollListener != null) {
            blsScrollListener.onBlsScrollStateListener(this, BlsScrollViewState.START, 0, 0, 0, 0);
        }
    }

    /**
     * 滑动结束
     */
    private void onScrollEnd() {
        if (blsScrollListener != null) {
            blsScrollListener.onBlsScrollStateListener(this, BlsScrollViewState.END, 0, 0, 0, 0);
        }
    }

    /**
     * 点触事件
     */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        super.onTouchEvent(ev);
        if (blsTouchListener != null) {
            blsTouchListener.onBlsTouchListener(this, ev);
        }
        return true;
    }


    /**
     * 滑动状态
     */
    public enum BlsScrollViewState {
        START,  //开始滑动
        SCROLL, //活动中
        END     //滑动结束
    }
}
